////////////////////////////////////////////////////////////////////////////////

#ifndef _SHAPE_H_
#define _SHAPE_H_

////////////////////////////////////////////////////////////////////////////////

#ifndef _PHYSICALTYPES_H_
#include "physicaltypes.h"
#endif

////////////////////////////////////////////////////////////////////////////////

class Intersector;

////////////////////////////////////////////////////////////////////////////////


/** Physical engine namespace */
namespace PE
{
////////////////////////////////////////////////////////////////////////////////

    struct Circle;
    struct Polygon;

////////////////////////////////////////////////////////////////////////////////

    /** Base class for shapes
    *
    *  @author   Anastasia Karpinska
    *  @since    Dec 5th, 2009
    *  @updated  Dec 5th, 2009
    *
    */
    struct Shape
    {
    ////////////////////////////////////////////////////////////////////////////


        /** Destructor */
        virtual ~Shape() {}
        

        /** Returns shapes intersector */
        virtual Intersector& GetIntersector( const Shape& _shape ) const = 0;


        /** Returns shapes intersector for shape with circle */
        virtual Intersector& GetCircleIntersector() const = 0;


        /** Returns shapes intersector for shape with polygon */
        virtual Intersector& GetPolygonIntersector() const = 0;


    ////////////////////////////////////////////////////////////////////////////

    };

////////////////////////////////////////////////////////////////////////////////

};


/** Creates collection of points */
PE::Points& operator,(PE::Points& _points, const PE::Point& _pt);


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////
